package br.com.caim.viewcontroller.receb;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Iterator;

import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import br.com.caim.bo.Mensagem;
import br.com.caim.bo.entidade.Conta;
import br.com.caim.email.excecoes.sistema.ContaEmailIndisponivelException;
import br.com.caim.email.receb.IRecebimentoEmail;
import br.com.caim.email.receb.impl.RecebimentoEmail;
import br.com.caim.viewcontroller.ActionPadrao;

public class RecebimentoMensagemAction extends ActionPadrao {
	
	public ActionForward receberEmail(ActionMapping mapping, ActionForm genericForm, HttpServletRequest request, HttpServletResponse response) throws ContaEmailIndisponivelException {
		IRecebimentoEmail recebEmail = new RecebimentoEmail();
		Message msgs[] = null;
		
		String strEnderecoConta = request.getParameter("enderecoConta");
		Conta conta = new Conta();
		
		Collection contas = (Collection) request.getSession().getAttribute("contas");
		
		// Recupera a conta que foi selecionada pelo usuario
		for(Iterator iterator = contas.iterator(); iterator.hasNext();) {
			conta = (Conta) iterator.next();
			
			if(conta.getEnderecoEmail().equals(strEnderecoConta)) {
				break;
			}
		}
		
		if(!contas.isEmpty()) {
			msgs = recebEmail.receberMensagens(conta.getEnderecoEmail(), conta.getSenha(), conta.getProvedor());
		}
		
		request.getSession().setAttribute("mensagensNovas", msgs);
		request.getSession().setAttribute("contaSelecionada", conta);
		
		return mapping.findForward("fwTelaPrincipal");
	}
	
	
	public ActionForward exibirDetalhesEmail(ActionMapping mapping, ActionForm genericForm, HttpServletRequest request, HttpServletResponse response) {
		ActionForward fwd = mapping.findForward("fwTelaDetalhes");
		String msgNumber = request.getParameter("paramId");
		Message msgs[] = (Message[]) request.getSession().getAttribute("mensagensNovas");
		Message message = null;
		
		// Itera buscando a mensagem a ser exibida
		for(int i = 0; i < msgs.length; i++) {
			if(String.valueOf(msgs[i].getMessageNumber()).equals(msgNumber)) {
				message = msgs[i];
			}
		}
		
		if(message == null) {
			fwd = mapping.findForward("fwTelaErro");
		} else {
			Mensagem mensagem = parseMessageToMensagem(message); 
			request.setAttribute("msgSelecionada", mensagem);
		}
		
		return fwd;
	}
	
	/**
	 * Este método auxiliar transforma os dados de um javax.mail.Message
	 * para um br.com.caim.bo.Mensagem.
	 * @return Mensagem formatada para ser exibida na tela
	 */
	private Mensagem parseMessageToMensagem(Message message) {
		Mensagem mensagem = new Mensagem();
		DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		
		try {
			mensagem.setDe(message.getFrom()[0].toString());
			mensagem.setPara(message.getAllRecipients()[0].toString());
			mensagem.setData(fmt.format(message.getSentDate()));
			mensagem.setAssunto(message.getSubject());
			
			// Recupera o conteudo da mensagem formatado
			String conteudo = getConteudoMensagem(message);
			mensagem.setConteudo(conteudo);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return mensagem;
	}
	
	/**
	 * Este método é responsável por formatar o conteúdo da mensagem que será exibida
	 * @param message
	 * @return String com o conteúdo da mensagem formatado.
	 * @throws IOException
	 * @throws MessagingException
	 */
	private String getConteudoMensagem(Message message) throws IOException, MessagingException {
		String strConteudo = "";
		Multipart multipart = null;
		Object conteudo = message.getContent();
		
		if(conteudo instanceof Multipart) {
			multipart = (Multipart) conteudo;
			
			int totalParts = multipart.getCount();
			
			for(int count = 0; count < totalParts; count++) {
				BodyPart part = multipart.getBodyPart(count);
				
				String disposition = part.getDisposition();

				if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT))) {
					// TODO implementar tratativa para anexo
					System.out.println("Isto eh um anexo: " + part.getContent());
				} else {
					System.out.println("Isto nao eh um anexo: " + part.getContent());
					if(part.isMimeType("text/html")) {
						strConteudo += part.getContent().toString();	
					}
				}
			}
		} else {
			strConteudo = (String) conteudo;
		}
		
		return strConteudo;
	}
}
